﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace DreamShield.Deployment.Miles.CustomPage.StandardPages
{
    /// <summary>
    /// Page qui affiche du texte à l'utilisateur, dans une boîte de texte
    /// (Utile pour afficher des informations supplémentaires en fonction de certaines conditions)
    /// </summary>
    public partial class PageTextDisplay : UserControl
    {
        /// <summary>
        /// Plugin interne généré pour l'interraction avec l'installeur
        /// </summary>
        public virtual CustomPagePlugin Plugin { get; protected set; }

        /// <summary>
        /// Variables globales de l'installation
        /// </summary>
        public virtual Dictionary<string, object> GlobalInstallerVariables
        {
            get { return Plugin.GlobalInstallerVariables; }
        }

        /// <summary>
        /// Id de la page générée
        /// </summary>
        public virtual string GeneratedPageId { get; protected set; }

        /// <summary>
        /// Crée une nouvelle page ayant pour but d'afficher du texte à l'utilisateur
        /// </summary>
        /// <param name="server">Serveur de plugin Miles actuel</param>
        /// <param name="pageId">Identifiant unique de la page généré (peut être n'importe quoi, mais ne doit pas être vide)</param>
        /// <param name="text">Texte à afficher</param>
        /// <param name="position">Id de la page par rapport à laquelle placer celle ci. Pour
        /// avoir le nom des pages par défauts, consultez <see cref="WizardPagesID"/> pour obtenir
        /// le nom des pages par défaut</param>
        /// <param name="appendAfter">Indique si la page personnalisée doit être rajoutée après la page position,
        /// sinon elle est insérée avant</param>
        public PageTextDisplay(MilesRootServer server, string pageId, string text, string position, bool appendAfter)
        {
            if (String.IsNullOrEmpty(pageId))
                throw new ArgumentNullException("pageId");
            if (server == null)
                throw new ArgumentNullException("server");

            GeneratedPageId = pageId;

            InitializeComponent();

            contentBox.Text = text;

            /* création du plugin de page personnalisé */
            Plugin = new CustomPagePlugin(server,
                position,
                appendAfter,
                pageId,
                this);

            /* différentes options de la page */
            Plugin.ShowForCustom = false;
            Plugin.ShowForInstall = true;
            Plugin.ShowForUninstall = false;
            Plugin.ShowForUpdate = false;
            Plugin.CanShow = true;
            Plugin.CanGoNext = true;
            Plugin.CanGoBack = true;
            Plugin.CanCancel = true;
        }

        /// <summary>
        /// Obtient ou défini une valeur indiquant si la page doit être affichée lors
        /// d'une opération de configuration personnalisée
        /// </summary>
        public virtual bool ShowForCustom
        {
            get { return Plugin.ShowForCustom; }
            set { Plugin.ShowForCustom = value; }
        }
        
        /// <summary>
        /// Obtient ou défini une valeur indiquant si la page doit être affichée lors
        /// d'une opération de configuration lors d'une installation
        /// </summary>
        public virtual bool ShowForInstall
        {
            get { return Plugin.ShowForInstall; }
            set { Plugin.ShowForInstall = value; }
        }

        /// <summary>
        /// Obtient ou défini une valeur indiquant si la page doit être affichée lors
        /// d'une opération de configuration lors d'une désinstallation
        /// </summary>
        public virtual bool ShowForUninstall
        {
            get { return Plugin.ShowForUninstall; }
            set { Plugin.ShowForUninstall = value; }
        }

        /// <summary>
        /// Obtient ou défini une valeur indiquant si la page doit être affichée lors
        /// d'une opération de configuration lors d'une mise à jour
        /// </summary>
        public virtual bool ShowForUpdate
        {
            get { return Plugin.ShowForUpdate; }
            set { Plugin.ShowForUpdate = value; }
        }

        /// <summary>
        /// RichTextBox utilisé pour afficher le texte
        /// </summary>
        public virtual RichTextBox ContentBox
        {
            get { return contentBox; }
        }
    }
}
